let psshs = chrome.extension.getBackgroundPage().psshs;
let requests = chrome.extension.getBackgroundPage().requests;
let pageURL = chrome.extension.getBackgroundPage().pageURL;
let targetIds = chrome.extension.getBackgroundPage().targetIds;

function disableButtons(buttonId, iconId, action) {
    const button = document.getElementById(buttonId);
    const icon = document.getElementById(iconId);
    button.disabled = action; // Désactiver ou activer le bouton
    if (action) {
        icon.classList.add('disabled-icon'); // Ajouter la classe désactivée à l'icône
    } else {
        icon.classList.remove('disabled-icon'); // Enlever la classe désactivée si l'action est false
    }
}

function DownloaderBatch() {
    const Command = document.getElementById('result').value;
    const batchContent = `@echo off\nN_m3u8DL-RE ${Command}\ndel "%~f0"\n`;
    const file = new Blob([batchContent], { type: 'text/plain;charset=utf-8' });
    try {
        if (window.navigator.msSaveOrOpenBlob) {
			window.navigator.msSaveOrOpenBlob(file, "DownloaderVideo.bat");
        } else {
			const a = document.createElement("a");
			a.href = URL.createObjectURL(file);
			a.download = "DownloaderVideo.bat";
			document.body.appendChild(a);
			a.click();
			URL.revokeObjectURL(a.href);
			document.body.removeChild(a);
        }
		disableButtons('copyButton','plusIcon4',true);
		disableButtons('Download','plusIcon5',true);
		alert("✅ Le fichier batch a été téléchargé avec succès !");
    } catch (error) {
		disableButtons('copyButton','plusIcon4',false);
		disableButtons('Download','plusIcon5',false);
        alert("❌ Une erreur s'est produite lors du téléchargement.");
    }
}

function SaveCommande() {
	const resultInput = document.getElementById("result");
	if (resultInput.value.length > 0) {
		const content = "N_m3u8DL-RE " + resultInput.value; // Ajoutez un espace entre les deux
		const file = new Blob([content], { type: 'text/plain;charset=utf-8' });
    try {
      if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(file, "Key.txt");
      } else {
        const a = document.createElement("a");
        a.href = URL.createObjectURL(file);
        a.download = "Key.txt";
        document.body.appendChild(a);
        a.click();
        URL.revokeObjectURL(a.href);
        document.body.removeChild(a);
      }
	  disableButtons('copyButton','plusIcon4',true);
      alert("✅ la commmande à bien enregistré !");
    } catch (error) {
		disableButtons('copyButton','plusIcon4',false);
		alert("❌ Erreur lors de l'enregistrement de la commande !");
    }
  }
}

function PastName() {
    const titlesInput = document.getElementById("titles");
    titlesInput.disabled = false; // Activer le champ de saisie
    // Lire le texte du presse-papiers
    navigator.clipboard.readText()
        .then(text => {
            if (text.length > 0) {
                const forbiddenChars = /[<>:"“/\\|?*]/g;
                const formattedText = text.replace(forbiddenChars, '').trim();
                titlesInput.value = formattedText; // Mettre à jour la valeur de l'input
                titlesInput.focus(); // Mettre le focus sur l'input
            } else {
                titlesInput.disabled = true;
                alert('❌ Le presse-papiers est vide.');
            }
        })
        .catch(err => {
            titlesInput.disabled = true;
            alert('❌ Échec de la lecture du contenu du presse-papiers : ' + err.message);
        });
}

function SaveMPD() {
    const mpdInput = document.getElementById("mpd");
    if (mpdInput.value.length > 0) {
        navigator.clipboard.writeText(mpdInput.value)
            .then(() => {
                alert("✅ Le MPD a bien été enregistré !");
            })
            .catch(err => {
                alert('❌ Échec de la sauvegarde du MPD : ' + err.message);
            });
    } else {
        alert('❌ Le champ MPD est vide.');
    }
}

async function autoFolder(){
	let selectRules = await fetch("Destination.txt").then((r) => r.text());
	if (selectRules.trim().length > 0) {
        document.getElementById('Folder').value = selectRules;
    } else {
        document.getElementById('Folder').value = "❌ Oups, Veuillez entrer un chemin de destination dans le fichier Destination.txt!";
    }
}

async function autoTitre() {
    chrome.storage.local.get('title', function(info) {
        const lastNameField = document.getElementById("titles");
        lastNameField.value = info.title ? info.title : "❌ Oups, aucun titre trouvé !";
    });
}

async function autoMPD() {
    chrome.storage.local.get('lastUrl', function(info) {
        document.getElementById("mpd").value = info.lastUrl ? info.lastUrl : "❌ Aucune URL MPD trouvée.";
    });
}

async function guess() {
	if (document.getElementById('titles').value.length === 0) {
        document.getElementById('result').style.fontSize = "24px";
        document.getElementById('result').style.textAlign = "center";
        document.getElementById('result').value = "❌ Oups, Aucun nom entré dans le nom vidéo.";
        document.getElementById('result').style.color = "red";
        return;
    } 
    if (document.getElementById('Folder').value.length === 0) {
        document.getElementById('result').style.fontSize = "24px";
        document.getElementById('result').style.textAlign = "center";
        document.getElementById('result').value = "❌ Oups, Aucune destination à été entrée.";
        document.getElementById('result').style.color = "red";
        return;
    }
    // Affichez un indicateur de chargement
    document.body.style.cursor = "wait";
	disableButtons('guess','plusIcon3',true);
    try {
        // Initialisation de Pyodide
        let pyodide = await loadPyodide();
        // Chargement des paquets nécessaires
        const packages = [
            "certifi-2024.2.2-py3-none-any.whl",
            "charset_normalizer-3.3.2-py3-none-any.whl",
            "construct-2.8.8-py2.py3-none-any.whl",
            "idna-3.6-py3-none-any.whl",
            "packaging-23.2.2-py3-none-any.whl",
            "protobuf-4.24.4-cp312-cp312-emscripten_3_1_52_wasm32.whl",
            "pycryptodome-3.20.0-cp35-abi3-emscripten_3_1_52_wasm32.whl",
            "pymp4-1.4.0-py3-none-any.whl",
            "pyodide_http-0.2.1-py3-none-any.whl",
            "pywidevine-1.8.0-py3-none-any.whl",
            "requests-2.31.0-py3-none-any.whl",
            "urllib3-2.2.1-py3-none-any.whl"
        ];
        for (const pkg of packages) {
            await pyodide.loadPackage(`/libs/wheels/${pkg}`);
        }
        // Configuration des variables pour Pyodide
        const psshValue = document.getElementById('pssh').value;
        const licenseIndex = userInputs['license'];
        const licenseRequest = requests[licenseIndex];
        if (!psshValue || !licenseRequest) {
            alert("❌ PSSH ou licence manquante.");
            return;
        }
        pyodide.globals.set("pssh", psshValue);
        pyodide.globals.set("licUrl", licenseRequest.url);
        pyodide.globals.set("licHeaders", licenseRequest.headers);
        pyodide.globals.set("licBody", licenseRequest.body);
        // Chargement des fichiers Python
        const pre = await fetch('/python/pre.py').then(res => {
            if (!res.ok) throw new Error('Erreur lors du chargement de pre.py');
            return res.text();
        });
        const after = await fetch('/python/after.py').then(res => {
            if (!res.ok) throw new Error('Erreur lors du chargement de after.py');
            return res.text();
        });
        const schemeValue = document.getElementById("scheme").value;
        const scheme = await fetch(`/python/schemes/${schemeValue}.py`).then(res => {
            if (!res.ok) throw new Error(`Erreur lors du chargement de ${schemeValue}.py`);
            return res.text();
        });
        // Exécution du code Python
        const result = await pyodide.runPythonAsync([pre, scheme, after].join("\n"));
        //document.getElementById('result').value = result;
		document.getElementById('result').value = `"${document.getElementById("mpd").value}" -M format=mp4 ${result}-sv best -sa best --save-name "${document.getElementById("titles").value}" --save-dir "${document.getElementById("Folder").value}"`;
    } catch (error) {
        console.error("Erreur:", error);
        document.getElementById('result').style.fontSize = "24px";
        document.getElementById('result').style.textAlign = "center";
        document.getElementById('result').value = "❌ Oups, Nous n'avons pas obtenu la clé !";
        document.getElementById('result').style.color = "red";
		disableButtons('guess','plusIcon3',false);
        alert("❌ " + error.message);
    } finally {
        // Restauration de l'état de l'interface
        document.body.style.cursor = "auto";
        disableButtons('guess','plusIcon3',true);
		disableButtons('copyButton','plusIcon4',false);
		disableButtons('Download','plusIcon5',false);
    }
}

window.corsFetch = (u, m, h, b) => {
    return new Promise((resolve) => {
        chrome.tabs.sendMessage(targetIds[0], { type: "FETCH", u, m, h, b }, { frameId: targetIds[1] }, resolve);
    });
}

async function autoSelect() {
    let selectRules = await fetch("/selectRules.conf").then(r => r.text());
    // Supprimer les lignes vides, les commentaires et les espaces en fin de ligne
    selectRules = selectRules.replace(/\n^\s*$|\s*\/\/.*|\s*$/gm, "");
    selectRules = selectRules.split("\n").map(row => row.split("$$"));
    for (let item of selectRules) {
        let search = requests.map(r => r['url']).findIndex(e => e.includes(item[0]));
        if (search >= 0) {
            if (item[1]) document.getElementById("scheme").value = item[1];
            userInputs["license"] = search;
            document.getElementById("license").value = requests[search]['url'];
			disableButtons('licenseButton','plusIcon',true);
            break;
        }
    }
    if (psshs.length === 1) {
        document.getElementById('pssh').value = psshs[0];
		disableButtons('psshButton','plusIcon2',true);
    }
    if (requests.length === 1) {
        userInputs["license"] = 0;
        document.getElementById("license").value = requests[0]['url'];
    }
}

function initializeEventListeners() {
	document.getElementById('guess').addEventListener("click", function(event) {
		event.preventDefault(); // Empêche la soumission du formulaire
		guess();
	});
    document.getElementById('CopyMDP').addEventListener("click", function(event) {
		event.preventDefault(); // Empêche la soumission du formulaire
		SaveMPD();
	});
    document.getElementById('TitlePaste').addEventListener("click", function(event) {
		event.preventDefault(); // Empêche la soumission du formulaire
		PastName();
	});
	document.getElementById('copyButton').addEventListener("click", function(event) {
		event.preventDefault(); // Empêche la soumission du formulaire
		SaveCommande();
	});
	document.getElementById('Download').addEventListener("click", function(event) {
		event.preventDefault(); // Empêche la soumission du formulaire
		DownloaderBatch();
	});
	disableButtons('copyButton','plusIcon4',true);
	disableButtons('Download','plusIcon5',true);
}

if (psshs.length) {
    document.getElementById('noEME').style.display = 'none';
    document.getElementById('home').style.display = 'grid';
    initializeEventListeners();
    autoSelect();
    autoMPD();
    autoTitre();
    autoFolder();
}